package com.example.mybatis_plus_use.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mybatis_plus_use.entity.Article;
import com.example.mybatis_plus_use.entity.User;
import com.example.mybatis_plus_use.service.ArticleService;
import com.example.mybatis_plus_use.utils.Result;
import com.example.mybatis_plus_use.vo.ArticleDetailVO;
import com.example.mybatis_plus_use.vo.ArticleListVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 文章表 前端控制器
 * </p>
 *
 * @author zjh
 * @since 2025-01-16
 */
@RestController
@RequestMapping("/article")
@Tag(name = "文章管理", description = "文章管理接口")
public class ArticleController extends BaseController {

    @Autowired
    private ArticleService articleService;

    /**
     * 新增文章
     */
    @PostMapping("/addArticle")
    @Operation(summary = "新增文章")
    public Result<Boolean> save(@RequestBody Article article) {
        return Result.success(articleService.save(article));
    }

    /**
     * 删除文章
     */
    @DeleteMapping("/{id}")
    @Operation(summary = "删除文章")
    public Result<Boolean> delete(@PathVariable Long id) {
        return Result.success(articleService.removeById(id));
    }

    /**
     * 更新文章
     */
    @PutMapping("/updateArticle")
    @Operation(summary = "更新文章")
    public Result<Boolean> update(@RequestBody Article article) {
        return Result.success(articleService.updateById(article));
    }

    /**
     * 查询单篇文章
     */
    @GetMapping("/{id}")
    @Operation(summary = "查询单篇文章")
    public Result<Article> get(@PathVariable Long id) {
        return Result.success(articleService.getById(id));
    }

    /**
     * 分页查询文章
     */
    @GetMapping("/page")
    @Operation(summary = "分页查询文章")
    public Result<IPage<Article>> page(@RequestParam(defaultValue = "1") int current,
                                       @RequestParam(defaultValue = "10") int size) {
        return Result.success(articleService.page(new Page<>(current, size)));
    }
    @GetMapping("/list")
    @Operation(summary = "查询文章列表")
    public List<ArticleListVO> getArticleList() {
        // 1. 获取文章列表
        //列表转为流然后转换为vo
        List<Article> articles = articleService.list();

        // 2. 转换为VO
        return articles.stream().map(article -> {
            ArticleListVO vo = new ArticleListVO();
            // 基本属性复制
            BeanUtils.copyProperties(article, vo);
            // 额外处理
            vo.setAuthorName(userService.getNameById(article.getAuthorId()));// 文章作者名称 额外处理
            vo.setCategoryName(categoryService.getNameById(article.getCategoryId())); // 文章分类名称 额外处理
            return vo;
        }).collect(Collectors.toList());
    }

    @Operation(summary = "查询单篇文章详情")
    @GetMapping("/getArticledetail/{id}")
    public ArticleDetailVO getArticleDetail(@PathVariable Long id) {
        // 1. 获取文章
        Article article = articleService.getById(id);

        // 2. 转换为VO
        ArticleDetailVO vo = new ArticleDetailVO();// 创建VO对象
        BeanUtils.copyProperties(article, vo);// 基本属性复制,要是vo中有article中没有的属性，要么加上，要么忽略。
                                                 //article中vo中没有的属性，忽略。

        return vo;
    }
}
//总的来说vo和dto的区别就是vo是用于展示的，dto是用于传输的。
//vo是用于展示的，dto是用于传输的。